home *** CD-ROM | disk | FTP | other *** search
- /*
- * dlrgint.c - versions of "large integer" routines for compiled programs
- * that do not support large integers.
- */
- #define COMPILER 1
- #include "::h:rt.h"
-
- /*
- *****************************************************************
- *
- * Routines in the first set are only called when large integers
- * exist and thus these versions will never be called. They need
- * only have the correct signature and compile without error.
- */
-
- /*
- * bignum -> file
- */
- novalue bigprint(f, da)
- FILE *f;
- dptr da;
- {
- }
-
- /*
- * bignum -> real
- */
- double bigtoreal(da)
- dptr da;
- {
- return 0.0;
- }
-
- /*
- * bignum -> string
- */
- int bigtos(da, dx)
- dptr da, dx;
- {
- return 0;
- }
-
- /*
- * da -> dx
- */
- int cpbignum(da, dx)
- dptr da, dx;
- {
- return 0;
- }
-
- /*
- * da / db -> dx
- */
- int bigdiv(da, db, dx)
- dptr da, db, dx;
- {
- return 0;
- }
-
- /*
- * da % db -> dx
- */
- int bigmod(da, db, dx)
- dptr da, db, dx;
- {
- return 0;
- }
-
- /*
- * iand(da, db) -> dx
- */
- int bigand(da, db, dx)
- dptr da, db, dx;
- {
- return 0;
- }
-
- /*
- * ior(da, db) -> dx
- */
- int bigor(da, db, dx)
- dptr da, db, dx;
- {
- return 0;
- }
-
- /*
- * xor(da, db) -> dx
- */
- int bigxor(da, db, dx)
- dptr da, db, dx;
- {
- return 0;
- }
-
- /*
- * negative if da < db
- * zero if da == db
- * positive if da > db
- */
- word bigcmp(da, db)
- dptr da, db;
- {
- return (word)0;
- }
-
- /*
- * ?da -> dx
- */
- int bigrand(da, dx)
- dptr da, dx;
- {
- return 0;
- }
-
- /*
- *************************************************************
- *
- * The following routines are called when overflow has occurred
- * during ordinary arithmetic.
- */
-
- /*
- * da + db -> dx
- */
- int bigadd(da, db, dx)
- dptr da, db;
- dptr dx;
- {
- t_errornumber = 203;
- t_errorvalue = nulldesc;
- t_have_val = 0;
- return Error;
- }
-
- /*
- * da * db -> dx
- */
- int bigmul(da, db, dx)
- dptr da, db, dx;
- {
- t_errornumber = 203;
- t_errorvalue = nulldesc;
- t_have_val = 0;
- return Error;
- }
-
- /*
- * -i -> dx
- */
- int bigneg(da, dx)
- dptr da, dx;
- {
- t_errornumber = 203;
- t_errorvalue = nulldesc;
- t_have_val = 0;
- return Error;
- }
-
- /*
- * da - db -> dx
- */
- int bigsub(da, db, dx)
- dptr da, db, dx;
- {
- t_errornumber = 203;
- t_errorvalue = nulldesc;
- t_have_val = 0;
- return Error;
- }
-
- /*
- * ********************************************************
- *
- * The remaining routines each requires different handling.
- */
-
- /*
- * real -> bignum
- */
- int realtobig(da, dx)
- dptr da, dx;
- {
- return Failed; /* conversion cannot be done */
- }
-
- /*
- * da ^ db -> dx
- */
- int bigpow(da, db, dx)
- dptr da, db, dx;
- {
- C_integer r;
- extern int over_flow;
-
- /*
- * Just do ordinary interger exponentiation and check for overflow.
- */
- r = iipow(IntVal(*da), IntVal(*db));
- if (over_flow) {
- k_errornumber = 203;
- k_errortext = "";
- k_errorvalue = nulldesc;
- have_errval = 0;
- return Error;
- }
- MakeInt(r, dx)
- return Succeeded;
- }
-
- /*
- * string -> bignum
- */
- word bigradix(sign, r, s, end_s, result)
- int sign; /* '-' or not */
- int r; /* radix 2 .. 36 */
- char *s, *end_s; /* input string */
- union numeric *result; /* output T_Integer or T_Lrgint */
- {
- /*
- * Just do string to ordinary integer.
- */
- return radix(sign, r, s, end_s, result);
- }
-
- /*
- * bigshift(da, db) -> dx
- */
- int bigshift(da, db, dx)
- dptr da, db, dx;
- {
- uword ci; /* shift in 0s, even if negative */
- C_integer cj;
-
- /*
- * Do an ordinary shift - note that db is always positive when this
- * routine is called.
- */
- ci = (uword)IntVal(*da);
- cj = IntVal(*db);
- /*
- * Check for a shift of WordSize or greater; return an explicit 0 because
- * this is beyond C's defined behavior. Otherwise shift as requested.
- */
- if (cj >= WordBits)
- ci = 0;
- else
- ci <<= cj;
- MakeInt(ci, dx)
- return Succeeded;
- }
-